/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package dao;

import dao.util.HibernateUtil;
import java.io.Serializable;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

/**
 *
 * @author vinh
 */
public abstract class AbstractDAO<P,K extends Serializable> {
    protected abstract Class getPoJoclass();
    
    public P get(K key) throws HibernateException{
        Session session=HibernateUtil.getSessionFactory().openSession();
        P p=(P)session.get(getPoJoclass(),key);
        session.close();
        return p;
    }
    
    public List<P> getList() throws HibernateException{
        Session session=HibernateUtil.getSessionFactory().openSession();
        String hql =String.format("select obj from %s obj",getPoJoclass().getName());
        Query query = session.createQuery(hql);
        List<P> list=query.list();
         session.close();
         return list;
    }
    
        public void saveorupdate(P p)throws HibernateException{
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction trans = session.beginTransaction();
        try {            
            session.saveOrUpdate(p);
            trans.commit();
        } catch (HibernateException ex) {
            //Log the exception 
            trans.rollback(); 
            System.err.println(ex);
        } finally {
            session.close();
        }      
    }
        
        public void delete(P p)throws HibernateException{
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction trans = session.beginTransaction();
        try {            
            session.delete(p);
            trans.commit();
        } catch (HibernateException ex) {
            //Log the exception 
            trans.rollback(); 
            System.err.println(ex);
        } finally {
            session.close();
        } 
        }
}
